home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / tosfixes / hsmoda04.lzh / SERSOFST.TXT < prev    next >
Text File  |  1993-11-20  |  34KB  |  776 lines

  1. Festlegung einer Softwareschnittstelle, die eine vollständig
  2. hardwareunabhängige Nutzung serieller Interfaces ermöglicht
  3. ============================================================
  4.  
  5. Definition of a software interface, providing a fully hardware independend 
  6. use of serial interfaces
  7. ============================================================
  8. (This file contains the english version too, begin to search at the 
  9. middle of the text.)
  10.  
  11.  
  12. Text von: Harun Scheutzow, Dresdener Straße 83, D-10179 Berlin
  13. Internet-Email: Harun_Scheutzow@B.maus.de
  14. letzte Änderung: 12.11.1993
  15.  
  16.  
  17. Es sollen möglichst alle Funktionen definiert werden, die ein 
  18. Terminalprogramm, ein Übertragungsprotokoll oder z.B. ein Faxprogramm 
  19. benötigt. Diese Funktionen sollen ein hardwareunabhängiges Interface für 
  20. Programme darstellen.
  21.  
  22. Dieser Vorschlag ist Eric Smith bekannt. Es ist (noch?) KEIN 
  23. offizieller Atari-Standard. Eric findet den Vorschlag gut (nur die 
  24. Callbacks hält er bezüglich Memory Protection für nicht so toll) und 
  25. meint: Es ist besser, einen inoffiziellen Standard zu haben, als gar 
  26. keinen. Originalton im englischen Teil.
  27.  
  28. MiNT oder TOS oder ein nachzuladender Treiber sollen möglichst viele der 
  29. hier beschriebenen Funktionen unterstützen, soweit es die Hardware zuläßt. 
  30. Es muß aber jede Soft damit rechnen, daß eine Funktion nicht existiert 
  31. (Rückmeldung EINVFN, -32). Verhindert dies die Arbeit der Soft, so muß der 
  32. Nutzer darüber informiert werden.
  33.  
  34. Dies hier ist ein Standardisierungsversuch für das Interface, daß 
  35. Nutzerprogramme vorfinden. Über die Interna der Treiberimplementation soll 
  36. nichts geschrieben werden. Bei allen Funktionen und Vorschlägen muß aber 
  37. daran gedacht werden, daß diese auch auf einem 68000 mit 8MHz bei 38400Bd 
  38. über den MFP (also ohne FIFO) realisierbar sind. Die steigende Leistung der 
  39. CPUs ist kein Argument, da die gewünschte Datentransferrate auch ständig 
  40. steigt.
  41.  
  42.  
  43. Fopen, Fread, Fwrite, Fclose dürften als normale GEMDOS-Funktionen jedem
  44. bekannt sein. Fcntl ist die im MiNT (und in HSMODEM) vorhandene GEMDOS-Funktion
  45. $104, mit LONG Fcntl( WORD filehandle, LONG special, WORD subfunction). Fcntl
  46. liefert meist eine 0 als OK-Meldung, oder sonst einen Fehlercode. Irgendwelche
  47. abgefragten Werte werden üblicherweise nicht als Returncode von Fcntl
  48. geliefert, sondern auf einer Speicherstelle, auf die special zeigt.
  49.  
  50. Die Reservierung einer Schnittstelle will ich über den Öffnungsmodus von Fopen 
  51. realisieren.
  52.  
  53.  
  54. ########################################################################
  55.  
  56. Ich werde noch eine deutsche Beschreibung der vorhandenen Fcntl-Funktionen für
  57. serielle Schnittstellen zusammenstellen, für HSMODEM1 muβ ich das sowieso. 
  58. Hier ein Versuch der Dokumentation, was MiNT bereits bieten soll (nicht 
  59. alle Funktionen funktionieren (ganz so wie sie sollen)):
  60.  
  61.  
  62. Manche Zeilen sind C, manche Kommentar. Bei den angegebenen 
  63. Funktionsaufrufen handelt es sich wirklich um Musteraufrufe, und nicht etwa 
  64. um mißgestaltete Prototypen.
  65.  
  66.  
  67.  
  68. Ermittlung, wieviel Byte nichtblockierend übertragen werden können
  69. ------------------------------------------------------------------
  70. #define FIONREAD  (('F'<< 8) | 1)
  71. #define FIONWRITE (('F'<< 8) | 2)
  72. Fcntl( handle, &count, FIONREAD)
  73. Fcntl( handle, &count, FIONWRITE)
  74. In count wird als 32Bit-Wert die Anzahl der Byte hinterlassen, die beim 
  75. nächsten Fread/Fwrite mindestens gelesen/geschrieben werden können. Da aber 
  76. möglicherweise mehrere Programme auf einen Port schreiben könnten, sollte 
  77. man nur den Returnwert von Fread/Fwrite für voll nehmen.
  78.  
  79.  
  80. Setzen und Rücksetzen von Break
  81. -------------------------------
  82. #define TIOCCBRK (('T'<< 8) | 20)
  83. #define TIOCSBRK (('T'<< 8) | 21)
  84. Fcntl( handle, dummy, TIOCSBRK); /* Break aktivieren */
  85. Fcntl( handle, dummy, TIOCCBRK); /* Break löschen */
  86.  
  87.  
  88. Setzen/Abfragen der Eingabegeschwindigkeit und Steuerung der DTR-Leitung
  89. ------------------------------------------------------------------------
  90. #define TIOCIBAUD (('T'<< 8) | 18)
  91. Fcntl( handle, &speed, TIOCIBAUD);
  92. Setze die Eingabegeschwindigkeit der Schnittstelle. In speed steht ein 
  93. 32Bit-Wert, der die gewünschte Geschwindigkeit unkodiert in Bit pro Sekunde 
  94. angibt. speed = 19200 würde auf 19200bps setzen. In speed wird die 
  95. Geschwindigkeit vor dem Aufruf von TIOCIBAUD zurückgegeben. Ist sie 
  96. unbekannt, wird -1 geliefert. Ist beim Aufruf speed = -1, so wird nur die 
  97. Geschwindigkeit erfragt. Ist speed = 0, so wird das DTR-Signal auf inaktiv 
  98. gebracht (gelöscht), ohne die Geschwindigkeit zu beeinflussen. Bei 
  99. geschwindigkeitssetzendem Aufruf wird DTR automatisch aktiviert. 
  100. Rückgabewert ist ERANGE wenn die Geschwindigkeit nicht einstellbar ist. 
  101. Dann wird als "Ausnahme" in speed die nächstniedrigere mögliche 
  102. Geschwindigkeit geliefert. Gibt es keine nächstniedrige, so wird die 
  103. kleinstmögliche zurückgegeben.
  104.  
  105.  
  106. Setzen/Abfragen der Ausgabegeschwindigkeit und Steuerung der DTR-Leitung 
  107. ------------------------------------------------------------------------
  108. #define TIOCOBAUD (('T'<< 8) | 19) Fcntl( handle, &speed, TIOCOBAUD);
  109. Setze die Ausgabegeschwindigkeit der Schnittstelle. Die 
  110. Funktionsbeschreibung ist identisch zu TIOCIBAUD. Unterstützt eine 
  111. Schnittstelle getrennte Ein- und Ausgabegeschwindigkeit nicht, so 
  112. beeinflußt jeder Aufruf beide Geschwindigkeiten.
  113.  
  114.  
  115. Übertragungsprotokolleinstellungen erfragen
  116. -------------------------------------------
  117. #define TIOCGFLAGS (('T'<< 8) | 22)
  118. Fcntl( handle, &flags, TIOCGFLAGS);
  119. Liefert in flags einen 16Bit-Wert der eingestellten Parameter, die eine 
  120. ODER-Verknüpfung der folgenden Werte darstellen. Alle anderen Bit sind 
  121. reserviert. Bei TIOCGFLAGS sollte man sie ignorieren. Sinnvollerweise 
  122. erfragt man mit TIOCGFLAGS, modifiziert die bekannten Werte, und setzt dann 
  123. per TIOCSFLAGS.
  124.  
  125. /* Anzahl der Stoppbits */
  126. #define TF_STOPBITS 0x0003
  127. /* 0x0000  nicht erlaubt
  128. ERWEITERUNGSVORSCHLAG: So wird der Synchronmode aktiviert. Die restlichen 
  129. Parameter erhalten im Synchronmode andere Bedeutungen. Diese sind später 
  130. noch festzulegen. */
  131. #define TF_1STOP   0x0001 /* 1 Stoppbit */
  132. #define TF_15STOP  0x0002 /* 1.5 Stoppbit */
  133. #define    TF_2STOP   0x0003 /* 2 Stoppbit */
  134.  
  135. /* Anzahl der Bits pro Zeichen */
  136. #define TF_CHARBITS 0x000C
  137. #define TF_8BIT    0x0 /* 8 Bit */
  138. #define TF_7BIT    0x4
  139. #define TF_6BIT    0x8
  140. #define TF_5BIT    0xC /* 5 Bit */
  141.  
  142. /* Handshakemodi und Parität */
  143. #define TF_FLAG  0xF000
  144. #define T_TANDEM 0x1000 /* XON/XOFF (=^Q/^S) Flußkontrolle aktiv */
  145. #define T_RTSCTS 0x2000 /* RTS/CTS Flußkontrolle aktiv */
  146. #define T_EVENP  0x4000 /* even (gerade) Parität aktiv */
  147. #define T_ODDP   0x8000 /* odd (ungerade) Parität aktiv */
  148. /* even und odd schließen sich gegenseitig aus */
  149.  
  150.  
  151. Übertragungsprotokolleinstellungen setzen
  152. -----------------------------------------
  153. #define TIOCSFLAGS (('T'<< 8) | 23)
  154. Fcntl( handle, &flags, TIOCSFLAGS);
  155. Setzt die Einstellungen, Beschreibung dieser bei TIOCGFLAGS. Rückgabewert 
  156. ist ERANGE bei illegaler / nicht unterstützer Kombination in flags.
  157.  
  158.  
  159. Ende der Dokumentattion der mir bekannten und verständlichen Funktionen in 
  160. MiNT.
  161.  
  162. ########################################################################
  163.  
  164. Es folgen die neuen Vorschläge:
  165.  
  166.  
  167. Leeren der seriellen Puffer
  168. ---------------------------
  169. #define TIOCFLUSH (('T'<< 8) | 8)
  170. (ist doch im Mint "/* BUG: this should flush the input/output buffers */")
  171. Auswählbar über den special-Parameter werden die seriellen Puffer 
  172. unterschiedlich geleert:
  173. special  Funktion
  174. 0
  175.          Der Sendepuffer soll komplett gesendet werden. Die Funktion kehrt 
  176.          erst zurück, wenn der Puffer leer ist (return E_OK, =0) oder ein 
  177.          systeminterner Timeout abgelaufen ist (return EDRVNR, =-2). Der 
  178.          Timeout wird vom System sinnvoll bestimmt.
  179. 1
  180.          Der Empfangspuffer wird gelöscht.
  181. 2
  182.          Der Sendepuffer wird gelöscht.
  183. 3
  184.          Empfangspuffer und Sendepuffer werden gelöscht.
  185. -tout
  186.          Ein negativer Parameter funktioniert wie 0, aber tout (man 
  187.          beachte, tout selbst ist positiv) gibt den Timeout in 1/200 
  188.          Sekunden vor.
  189.  
  190.  
  191. Stoppen des E